package com.iwhalecloud.citybrain.flow.platform.manager.domain.repository;

import java.util.List;

import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.FlowUser;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.User;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.app.FlowApp;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.app.FlowAppAddVo;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.app.FlowAppBusiSimpleVo;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.app.FlowAppQueryVo;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.app.FlowAppUpdateVo;


/**
 * @author lilh
 * @date 2019-01-22 15:52
 */
public interface FlowAppRepository {

    /**
     * 增加
     */
    Integer insert(FlowAppAddVo flowAppAddVo);


    /**
     * 查询
     */
    List<FlowApp> list(FlowAppQueryVo queryVo);

    /**
     * 更新
     */
    Integer update(FlowAppUpdateVo flowAppUpdateVo);

    /**
     * 删除
     */
    Boolean delete(Integer appId);

    /**
     * 应用详情
     */
    FlowApp detail(Integer appId);

    /**
     * 查询所有
     *
     * @param id appId
     */
    List<FlowApp> listByAppId(Integer id);

    /**
     * 校验应用是否已授权当前用户
     *
     * @param user
     * @param appId
     * @param busiId
     * @return
     */
    boolean verifyAppAuthorized(User user, Integer appId, Integer busiId);

    /**
     * 应用给用户授权
     *
     * @param appId
     * @param userList
     * @return 本次成功授权人数
     */
    Integer authorize(Integer appId, List<FlowUser> userList);

    /**
     * 组装应用与业务列表
     *
     * @param flowAppInfos
     * @return
     */
    List<FlowAppBusiSimpleVo> getAppAndBusiList(List<FlowApp> flowAppInfos);

    /**
     * 查询应用列表
     *
     * @param appCode 应用编码
     * @return 列表
     */
    List<FlowApp> listByAppCode(String appCode);

    /**
     * 查询应用列表
     *
     * @param tenantId 租户id
     * @return 列表
     */
    List<FlowApp> listByTenantId(Integer tenantId);

    /**
     * 查询应用列表
     *
     * @param tenantIds 租户id集合
     * @return 应用列表
     */
    List<FlowApp> listByTenantIds(List<Integer> tenantIds);

    /**
     * 取消用户的应用授权
     *
     * @param appId
     * @param userList
     * @return
     */
    Integer authorizedCancel(Integer appId, List<FlowUser> userList);

    /**
     * 取消授权
     *
     * @param tenantId 租户id
     * @param userIds  用户id
     * @return 处理结果
     */
    boolean authorizedCancel(List<Integer> userIds, Integer tenantId);


    /**
     * 根据租户id和userCode查询已授权应用
     *
     * @param tenantId 租户id
     * @param userCode 用户code
     * @return 已授权应用
     */
    List<FlowApp> listAppByTenantIdAndUserCode(Integer tenantId, String userCode);

    /**
     * 根据租户ids和用户code查询应用
     *
     * @param tenantIds 租户ids
     * @param userCode  用户code
     * @return 应用列表
     */
    List<FlowApp> listApps(List<Integer> tenantIds, String userCode);

    /**
     * processInstanceId
     *
     * @param processInstanceId
     * @return
     */
    List<FlowApp> getAppInfoByProcessInstanceId(String processInstanceId);

}
